<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>22.灵活的控制属性的特征</title>
</head>

<body>
  <script>
    const user = {
      age: 18
    };
    //{ "value": 18, "writable": true, "enumerable": true, "configurable": true }
    console.log(JSON.stringify(Object.getOwnPropertyDescriptor(user, 'age'), null, 2));
    // 增加或修改属性
    Object.defineProperty(user, 'name', {
      value: '后盾人',
      writable: false,// 不能修改
      enumerable: false, //禁止遍历
      configurable: true, //不可以被删除，和配置
    });
    /* 
    已经设置了不可,再重复修改配置会报错  
    at Function.defineProperty (<anonymous>)
    at 22.灵活的控制属性的特征.html:28:12
    Object.defineProperty(user,'name',{
      value: '后盾人',
      writable: false,// 不能修改
      enumerable: false, //禁止遍历
      configurable: true, //不可以被删除，和配置
    }); */
    user.name = 'mm'; // 属性被设置为不能修改，使用严格模式这行会报错
    console.log(user.name);//后盾人 
    console.log(Object.keys(user));//  ['age'] ,name属性不能被遍历到

    delete user.name; //严格模式下这样也会报错，因为被configurable配置为false 不可更改
    console.log(user); //{age: 18, name: '后盾人'}

    // 批量配置
    const user2 = {
      name: 'ok',
      age: 18
    };
    Object.defineProperties(user2,{
      name: {
        value: '后盾人',
        writable: false,// 不能修改
        enumerable: false, //禁止遍历
        configurable: true, //不可以被删除，和配置
      },
      age: {
        value: '19',
        writable: false,// 不能修改
        enumerable: false, //禁止遍历
        configurable: true, //不可以被删除，和配置
      }
    });
    console.log(user2);
    console.log(user.);
  </script>
</body>

</html>